package com.lmaos.basetools.base;

import com.lmaos.allcontrol.beancontrol.utils_.TimeUtils;

/**
 * 
 * @author lmaos
 *
 * <p>作者：张星宇</p>
 * <p>时间：2017年7月12日 下午12:46:05</p>
 * <p>说明:同步锁对象，用来获得 synchronized 局部的锁引用		</p>
 *
 */
public class SLock<T> {
	Object locks[] = null;
	T[] values = null;
	/** 锁
	 * 
	 * @param size 允许同一时间通过并发数。局部字段锁
	 */
	public SLock(int size) {
		locks = new Object[size];
		for (int i = 0; i < locks.length; i++) {
			locks[i] = new Object();
		}
	}
	
	public SLock(T[] values) {
		this.values = values;
		locks = new Object[values.length];
		for (int i = 0; i < locks.length; i++) {
			locks[i] = new Object();
		}
	}

	/**
	 * 说明：获得这个字段对应的锁		<br>
	 * 时间：2017年7月12日 下午12:45:30
	 *
	 * @param obj
	 * @return
	 */
	public Object getLock(Object obj){
		return getLock(obj.hashCode() % locks.length);
	}
	public Object getLock(int index){
		if(index>=locks.length){
			return locks[index%locks.length];
		}
		return locks[index];
	}
	/**
	 * 说明：获得这个字段对应的功能对象		<br>
	 * 时间：2017年7月19日 下午15:15:30
	 * @param obj
	 * @return
	 */
	public T getValue(Object obj){
		return getValue(obj.hashCode() % values.length);
	}
	public T getValue(int index){
		if(values == null){
			return null;
		}
		return values[index];
	}
	public int size(){
		return locks.length;
	}
	public static void main(String[] args) {
		final SLock s = new SLock(2);
		for (int i = 0; i < 10; i++) {
			final int k = i;
			new Thread(){
			public void run() {
				synchronized (s.getLock(""+k/2)) {
					System.out.println(k);
					TimeUtils.sleep(1000);
					
				}
			}
			}.start();
		}
	}
		
}
